\chapter{QCoreApplication}

QCoreApplication 类

QCoreApplication类为没有UI的Qt程序提供了一个事件循环。

\begin{tabular}{|r|l|}
\hline
属性&	方法\\
\hline
头文件&	\#include <QCoreApplication>\\
\hline
qmake&	QT+=core\\
\hline
自从&	Qt 4.6\\
\hline
继承&	QObject\\
\hline
派生&	QGuiApplication\\
\hline
\end{tabular}

\section{属性}

\begin{tabular}{|l|l|l|l|}
\hline
属性&	类型&	属性&	类型\\
\hline
applicationName&	QString&	organizationName&	QString\\
\hline
applicationVersion&	QString&	quitLockEnabled	&QString\\
\hline
organizationDomain&	QString&		&\\
\hline
\end{tabular}

\splitLine

\section{公共成员函数}

\subsection{详细说明}

此类为那些没有GUI的应用程序提供消息循环。对于使用Qt但无GUI的程序，它们必须有且仅有一个QCoreApplication对象。对于GUI应用程序，请参见QGuiApplication。对于使用了Qt Widgets的模块，请参见QApplication。

QCoreApplication包含主事件循环，这些来自于操作系统（如定时器、网络事件等）及其它来源的事件将由它来处理和派发。它同时也处理应用程序的初始化和析构，以及全系统和全程序的设置。

\subsection{事件循环及事件处理}

消息循环从调用exec()开始。长时间运行的一些操作也可以通过调用processEvents()让程序保持响应。

一般地，我们建议您尽可能早地在您的main()函数中创建QCoreApplication、QGuiApplication或QApplication。当消息循环退出时，例如当quit()被调用时，exec()才会返回。

我们也提供了一些便捷的静态函数。QCoreApplication对象能够通过instance()来获取。您可以通过sendEvent()来发送事件，以及通过postEvent()来投送事件。待处理的事件能通过removePostedEvents()来移除，亦可通过sendPostedEvents()来派发。

此类提供了一个槽函数quit()及一个信号aboutToQuit()。

\subsection{程序和库路径}

一个应用程序有一个applicationDirPath()和一个applicationFilePath()。库路径(参见QLibrary)能通过libraryPaths()被获取，且能通过setLibraryPaths()、addLibraryPath()和removeLibraryPath()来对它进行操作。

\subsection{国际化和翻译}

翻译文件能分别通过installTranslator()和removeTranslator()被加载和移除。您可以通过translate()来翻译应用中的字符串。QObject::tr()和QObject::trUtf8()这两个函数根据translate()来进行了实现。

\subsection{访问命令行参数}

您应该通过arguments()来获取传递给QCoreApplication构造函数的命令行参数。

\begin{notice}
	QCoreApplication将移除 \hl{-qmljsdebugger="..."} 选项。它会解析
\hl{qmljsdebugger} 参数，然后删除此选项及其参数。
\end{notice}


对于一些更加高级的命令行参数的处理，请创建一个QCommandLineParser。

\subsection{区域设置}

运行在Unix/Linux的Qt程序，将会默认使用系统的区域设置。这可能会导致在使用POSIX函数时发生冲突，例如，数据类型转换时由转换浮点数转换为字符串，由于不同区域符号的差异可能会导致一些冲突。为了解决这个问题，在初始化QGuiApplication、QApplication或QCoreApplication之后，需要马上调用POSIX函数setlocale(LC\_NUMERIC, "C")，以重新将数字的格式设置为"C"-locale。

\begin{seeAlso}
QGuiApplication, QAbstractEventDispatcher, QEventLoop, Semaphores Example, 以及Wait Conditions Example。
\end{seeAlso}

\splitLine

\section{属性文档}

applicationName : QString

此属性保存应用程序的名字。

当使用空的构造函数初始化QSettings类的实例时，此属性被使用。这样一来，每次创建QSettings对象时，都不必重复此信息。

如果未设置，则应用程序名称默认为可执行文件名称（自5.0开始）。

访问函数：

\begin{tabular}{|l|l|}
\hline
QString	&applicationName()\\
\hline
void	&setApplicationName(const QString \&application)\\
\hline
\end{tabular}

通知信号：

\begin{tabular}{|l|l|}
\hline
void	&applicationNameChanged()\\
\hline
\end{tabular}

另请参阅 organizationName, organizationDomain, applicationVersion, 以及 applicationFilePath()。

applicationVersion: QString

此属性保存应用程序的版本。

如果没有设置此属性，那么此属性将会被默认设置为平台相关的值，该值由主应
用程序的可执行文件或程序包确定（自Qt 5.9起）：

\begin{tabular}{|l|l|}
\hline
平台	&源\\
\hline
Windows (经典桌面)&	VERSIONINFO 资源中的 PRODUCTVERSION 参数\\
\hline
Windows通用应用平台(UWP)&	应用程序包中清单文件的版本属性\\
\hline
macOS, iOS, tvOS, watchOS&	信息属性列表中的CFBundleVersion属性\\
\hline
Android	&AndroidManifest.xml清单中的android:versionName属性\\
\hline
\end{tabular}

在其他平台上，此属性默认值为空字符串。

此属性自Qt 4.4引入。

访问函数：

\begin{tabular}{|l|l|}
\hline
QString&	applicationVersion()\\
\hline
void&	setApplicationVersion(const QString \&version)\\
\hline
\end{tabular}

通知信号：

\begin{tabular}{|l|l|}
\hline
void	&applicationVersionChanged()\\
\hline
\end{tabular}

\begin{seeAlso}
applicationName, organizationName, 以及organizationDomain。
\end{seeAlso}

organizationDomain: QString

此属性保存编写此应用程序的组织的Internet域。

当使用空的构造函数初始化QSettings类的实例时，此属性被使用。这样一来，每次创建QSettings对象时，都不必重复此信息。

在Mac上，如果organizationDomain()不是一个空值，那么QSettings将会使用它；否则它将会使用organizatioName()。在其他平台上，QSettings将organizationName()作为组织名来使用。

访问函数：

\begin{tabular}{|l|l|}
\hline
QString&	organizationName()\\
\hline
void&	setOrganizationName(const QString \&orgName)\\
\hline
\end{tabular}

通知信号：

\begin{tabular}{|l|l|}
\hline
void	&organizationNameChanged()\\
\hline
\end{tabular}

\begin{seeAlso}
 applicationDomain和applicationName。
\end{seeAlso}

quitLockEnabled: bool

此属性保存使用QEventLoopLocker是否能退出的特性。

默认值是true。

访问函数：

\begin{tabular}{|l|l|}
\hline
bool&	isQuitLockEnabled()\\
hline
void&	setQuitLockEnabled(bool enabled)\\
\hline
\end{tabular}


\begin{seeAlso}
QEventLoopLocker。
\end{seeAlso}

\splitLine

成员函数文档

QCoreApplication::QCoreApplication(int \&argc, char **argv)

构造一个Qt内核程序。所谓内核程序，就是没有图形用户界面的程序。这样的程序使用控制台，或者是作为服务进程运行着。

argc和argv参数将会被应用程序处理，将其转换为一种更加便捷的形式，并可以通过arguments()来获取。


\begin{notice}[ 警告]
argc和argv这两个值所指向的内存，必须在整个QCoreApplication生命周期内有效。另外，agrc必须要大于0，且argv必须至少包含一个合法的字符串。
\end{notice}

void QCoreApplication::aboutToQuit() [signal]

当程序即将退出主消息循环时，如当消息循环嵌套层数降为0时，此事件被发射。它可能发生在应用程序中调用quit()之后，亦发生在关闭整个桌面会话时。



\begin{notice}
这是一个私有信号。它能够被连接，但是用户无法发射它。
\end{notice}

\begin{seeAlso}
quit()。
\end{seeAlso}

void QCoreApplication::quit() [static slot]

告知程序以返回值0来退出。等效于调用 QCoreApplication::exit(0)。

一般我们将quit()槽连接到QGuiApplication::lastWindowClosed()信号，您同样可以将此槽连接到QAction、QMenu或QMenuBar的QAbstractButton::clicked()信号上。

将信号以QueuedConnection参数连接此槽是一个不错的实践。如果连接了此槽的一个信号（未在队列中的）在控制流程进入主消息循环前（如在int main中调用exec()之前）被发射，那么这个槽不会有任何效果，应用程序也不会退出。使用队列连接方式能保证控制路程进入主消息循环后，此槽才会被触发。

例如：

\begin{cppcode}
QPushButton *quitButton = new QPushButton("Quit");
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection);
\end{cppcode}

\begin{seeAlso}
exit(), aboutToQuit(), and QGuiApplication::lastWindowClosed()。
\end{seeAlso}


QCoreApplication::$\sim$QCoreApplication() [virtual]

销毁QCoreApplication对象。

void QCoreApplication::addLibraryPath(const QString \&path) [static]

将path添加到库路径开头，保证它先会被库搜索到。如果path为空或者已经存在于路径列表，那么路径列表保持不变。

默认的路径列表只包含一个条目，即插件安装路径。默认的插件安装文件夹是INSTALL/plugins，其中INSTALL是Qt安装文件夹。

当QCoreApplication被销毁后，这些库路径将会被重设为默认值。

\begin{seeAlso}
removeLibraryPath(), libraryPaths(), and setLibraryPaths().
\end{seeAlso}

QString QCoreApplication::applicationDirPath() [static]
返回包含此可执行文件的文件夹路径。

例如，您已经在C:/Qt安装了Qt，然后运行regexp示例，那么这个函数会返回"C:/Qt:/examples/tools/regexp"。

在macOS和iOS上，它会指向实际包含可执行文件的目录，该目录可能在一个应用程序包内（如果是以应用程序包形式存在）。

\begin{warning}
在Linux上，这个函数会尝试从/proc获取文件路径。如果失败了，那么它假设argv[0]包含了可执行文件的绝对路径。此函数同样也假设了应用程序不会改变当前路径。
\end{warning}

\begin{seeAlso}
applicationFilePath()。
\end{seeAlso}


QString QCoreApplication::applicationFilePath() [static]

返回包含此可执行文件的文件路径。

例如，您已经在/usr/local/qt目录安装了Qt，然后运行regexp示例，那么这个函数会返回"/usr/local/qt/examples/tools/regexp/regexp"。


\begin{warning}
在Linux上，这个函数会尝试从/proc获取文件路径。如果失败了，那么它假设argv[0]包含了可执行文件的绝对路径。此函数同样也假设了应用程序不会改变当前路径。
\end{warning}

\begin{seeAlso}
applicationDirPath()。
\end{seeAlso}

qint64 QCoreApplication::applicationPid() [static]

返回当前应用程序的进程ID。

此函数自Qt 4.4引入。

QStringList QCoreApplication::arguments() [static]

返回命令行参数列表。

一般情况下，arguments().at(0)表示可执行文件名，arguments().at(1)是第一个参数，arguments().last()是最后一个参数。请见下面关于Windows的注释。

调用这个函数需要花费很多时间——您应该在解析命令行时，将结果缓存起来。

\begin{warning}
在Unix下，这个参数列表由main()函数中的argc和argv参数生成。argv中的字符串数据将会通过QString::fromLocal8Bit()来解析，因此，在Latin1的区域环境下，是不可能来传递日语的命令行的，其他情况以此类推。大部分现代Unix系统没有此限制，因为它们是基于Unicode的。
\end{warning}

在Windows下，这个参数列表，只有在构造函数中传入了修改的argc和argv时，才会从这个argc和argv中解析。这种情况下，就会出现编码问题。

如果不是上述情况，那么arguments()将会从GetCommandLine()中构造。此时arguments().at(0)在Windows下未必是可执行文件名，而是取决于程序是如何被启动的。

此函数自Qt 4.1引入。



\begin{seeAlso}
applicationFilePath()和QCommandLineParser。
\end{seeAlso}

bool QCoreApplication::closingDown() [static]

如果application对象正在被销毁中，则返回true，否则返回false。


\begin{seeAlso}
startingUp()。
\end{seeAlso}

bool QCoreApplication::event(QEvent *e) [override virtual protected]

重写了：QObject::event(QEvent* e)。

QAbstractEventDispatcher *QCoreApplication::eventDispatcher() [static]

返回指向主线程事件派发器的指针。如果线程中没有事件派发器，则返回nullptr。



\begin{seeAlso}
 setEventDispatcher()。
\end{seeAlso}

int QCoreApplication::exec() [static]

进入主消息循环，直到exit()被调用。其返回值是为exit()传入的那个参数（如果是调用quit()，等效于调用exit(0))。

通过此函数来开始事件循环是很有必要的。主线程事件循环将从窗口系统接收事件，并派发给应用程序下的窗体。

为了能让您的程序在空闲时来处理事件（在没有待处理的事件时，通过调用一个特殊的函数），可以使用一个超时为0的QTimer。可以使用processEvents()来跟进一步处理空闲事件。

我们建议您连接aboutToQuit()信号来做一些清理工作，而不是将它们放在main函数中。因为在某些平台下，exec()可能不会返回。例如，在Windows下，当用户注销时，系统将在Qt关闭所有顶层窗口后才终止进程。因此，不能保证程序有时间退出其消息循环来执行main函数中exec()之后的代码。


\begin{seeAlso}
quit()，exit(), processEvent()和QApplication::exec()。
\end{seeAlso}

void QCoreApplication::exit(int returnCode = 0) [static]

告诉程序需要退出了，并带上一个返回值。

在此函数被调用后，程序将离开主消息循环，并且从exec()中返回。其返回值就是returnCode。如果消息循环没有运行，那么此方法什么都不做。

一般我们约定0表示成功，非0表示产生了一个错误。

将信号以QueuedConnection参数连接此槽是一个不错的实践。如果连接了此槽的一个信号（未在队列中的）在控制流程进入主消息循环前（如在int main中调用exec()之前）被发射，那么这个槽不会有任何效果，应用程序也不会退出。使用队列连接方式能保证控制路程进入主消息循环后，此槽才会被触发。


\begin{seeAlso}
quit()和exec()。
\end{seeAlso}

void QCoreApplication::installNativeEventFilter(QAbstractNativeEventFilter *filterObj)

在主线程为应用程序所能接收到的原生事件安装一个事件过滤器。

事件过滤器filterObj通过nativeEventFilter()来接收事件。它可以接收到主线程所有的原生事件。

如果某个原生事件需要被过滤或被屏蔽，那么QAbstractNativeEventFilter::nativeEventFilter需要返回true。如果它需要使用Qt默认处理流程，则返回false：那么接下来这个原生事件则会被翻译为一个QEvent，并且由Qt的标准事件过滤器来处理。

如果有多个事件过滤器被安装了，那么最后安装的过滤器将会被最先调用。


\begin{notice}
 此处设置的过滤器功能接收原生事件，即MSG或XCB事件结构。
\end{notice}


\begin{notice}
如果设置了Qt::AA\_PluginApplication属性，那么原生事件过滤器将会被屏蔽。
\end{notice}


为了最大可能保持可移植性，您应该总是尽可能使用QEvent和QObject::installEventFilter()。



\begin{seeAlso}
QObject::installEventFilter()。
\end{seeAlso}

bool QCoreApplication::installTranslator(QTranslator *translationFile) [static]

将translationFile添加到翻译文件列表，它将会被用于翻译。

您可以安装多个翻译文件。这些翻译文件将会按照安装顺序的逆序被搜索到，因此最近添加的翻译文件会首先被搜索到，第一个安装的搜索文件会最后被搜索。一旦翻译文件中匹配了一个字符串，那么搜索就会终止。

安装、移除一个QTranslator，或者更改一个已经安装的QTranslator将会为QCoreApplication实例产生一个LanguageChange事件。一个QApplication会将这个事件派发到所有的顶层窗体，使用tr()来传递用户可见的字符串到对应的属性设置器，通过这种方式来重新实现changeEvent则可以重新翻译用户的界面。通过Qt设计师(Qt Designer)生成的窗体类提供了一个retranslateUi()可以实现上述效果。

函数若执行成功则返回true，失败则返回false。



\begin{seeAlso}
removeTranslator()，translate()，QTranslator::load()和动态翻译。
\end{seeAlso}

QCoreApplication* QCoreApplication::instance() [static]

返回程序的QCoreApplication (或QGuiApplication/QApplication)实例的指针。

bool QCoreApplication::isSetuidAllowed() [static]

如果在UNIX平台中，允许应用程序使用setuid，则返回true。

此函数自Qt 5.3引入。


\begin{seeAlso}
QCoreApplication::setSetuidAllowed()。
\end{seeAlso}

QStringList QCoreApplication::libraryPaths() [static]

返回一个路径列表，其中的路径表示动态加载链接库时的搜索路径。

此函数的返回值也许会在QCoreApplication创建之后改变，因此不建议在QCoreApplication创建之前调用。应用程序所在的路径（非工作路径），如果是已知的，那么它会被放入列表中。为了能知道这个路径，QCoreApplication必须要在创建时使用argv[0]来表示此路径。

Qt提供默认的库搜索路径，但是它们同样也可以通过qt.conf文件配置。在此文件中所指定的路径会覆盖默认路径。注意如果qt.conf文件存在于应用程序所在的文件夹目录下，那么直到QCoreApplication被创建时它才可以被发现。如果它没有被发现，那么调用此函数仍然返回默认搜索路径。

如果插件存在，那么这个列表会包含插件安装目录（默认的插件安装目录是
\hl{INSTALL/plugins}，其中 \hl{INSTALL} 是Qt所安装的目录。用分号分隔的\hl{QT\_PLUGIN\_PATH}环境变量中的条目一定会被添加到列表。插件安装目录（以及它存在）在应用程序目录已知时可能会被更改。

如果您想遍历列表，可以使用foreach伪关键字：

\begin{cppcode}
foreach (const QString &path, app.libraryPaths())
    do_something(path);
\end{cppcode}



\begin{seeAlso}
 setLibraryPaths(), addLibraryPath(), removeLibraryPath(), QLibrary , 以及 如何创建Qt插件。
\end{seeAlso}

bool QCoreApplication::notify(QObject receiver, QEvent event) [virtual]

将事件发送给接收者：receiver->event(event)。其返回值为接受者的事件处理器的返回值。注意这个函数将会在任意线程中调用，并将事件转发给任意对象。

对于一些特定的事件（如鼠标、键盘事件），如果事件处理器不处理此事件（也就是它返回false），那么事件会被逐级派发到对象的父亲，一直派发到顶层对象。

处理事件有5种不同的方式：重写虚函数只是其中一种。所有的五种途径如下所
示：

\begin{compactenum}
\item 重写paintEvent()，mousePressEvent()等。这个是最通用、最简单但最不强大的一种方法。
\item 重写此函数。这非常强大，提供了完全控制，但是一次只能激活一个子类。
\item 将一个事件过滤器安装到QCoreApplication。这样的一个事件过滤器可以处理所有窗体的所有事件，就像是重写了notify()函数这样强大。此外，您还可以提供多个应用级别全局的事件过滤器。全局事件过滤器甚至可以接收到那些不可用窗体的鼠标事件。注意程序的事件过滤器仅能响应主线程中的对象。
\item 重写QObject::event()（就像QWidget那样）。如果您是这样做的，您可以接收到Tab按键，及您可以在任何特定窗体的事件过滤器被调用之前接收到事件。
\item 在对象上安装事件过滤器。这样的事件过滤器将可以收到所有事件，包括Tab和Shift+Tab事件——只要它们不更改窗体的焦点。
\end{compactenum}


未来规划：在Qt 6中，这个函数不会响应主线程之外的对象。需要该功能的应用程序应同时为其事件检查需求找到其他解决方案。该更改可能会扩展到主线程，因此不建议使用此功能。

\begin{notice}
如果您重写此函数，在您的应用程序开始析构之前，您必须保证所有正在处理事件的线程停止处理事件。这包括了您可能在用的其他库所创建的线程，但是不适用于Qt自己的线程。
\end{notice}

\begin{seeAlso}
QObject::event()和installNativeEventFilter()。
\end{seeAlso}

void QCoreApplication::postEvent(QObject* receiver, QEvent* event, int priority = Qt::NormalEventPriority) [static]

添加一个event事件，其中receiver表示事件的接收方。事件被添加到消息队列，并立即返回。

被添加的事件必须被分配在堆上，这样消息队列才能接管此事件，并在它被投送之后删除它。当它被投递之后，再来访问此事件是不安全的。

当程序流程返回到了主事件循环时，所有的队列中的事件会通过notify()来发送。

队列中的事件按照priority降序排列，这意味着高优先级的事件将排列于低优先
级之前。优先级priority可以是任何整数，只要它们在\hl{INT\_MAX} 和
\hl{INT\_MIN} 之闭区间内。相同优先级的事件会按照投送顺序被处理。


\begin{notice}
此函数是线程安全的。
\end{notice}


此函数自Qt 4.3引入。

\begin{seeAlso}
sendEvent()，notify()，sendPostedEvents()，和Qt::EventPriority。
\end{seeAlso}

void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents) [static]

根据flags处理调用线程的所有待处理事件，直到没有事件需要处理。

您可以在您程序进行一项长时间操作的时候偶尔调用此函数（例如拷贝一个文件时）。

如果您在一个本地循环中持续调用这个函数，而不是在消息循环中，那么DeferredDelete事件不会被处理。这会影响到一些窗体的行为，例如QToolTip，它依赖DeferredDelete事件。以使其正常运行。一种替代方法是从该本地循环中调用sendPostedEvents()。

此函数只处理调用线程的事件，当所有可处理事件处理完毕之后返回。可用事件是在函数调用之前排队的事件。这意味着在函数运行时投送的事件将会排队到下一轮事件处理为止。


\begin{notice}
此函数是线程安全的。
\end{notice}

\begin{seeAlso}
exec()，QTimer，QEventLoop::processEvents()，flush()和sendPostedEvents()。
\end{seeAlso}

void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags
\emph{flags} = QEventLoop::AllEvents, int \emph{ms}) [static]

此函数重写了processEvents()。

此函数将用ms毫秒为调用线程处理待处理的事件，或者直到没有更多事件需要处理。

您可以在您程序进行一项长时间操作的时候偶尔调用此函数（例如拷贝一个文件时）。

此函数只处理调用线程的事件。


\begin{notice}
不像processEvents()的重写，这个函数同样也处理当函数正在运行中时被投送的事件。)，QTimer，QEventLoop::processEvents()。
\end{notice}

\begin{seeAlso}
exec()，QTimer，QEventLoop::processEvents()。
\end{seeAlso}

void QCoreApplication::removeLibraryPath(const QString \emph{\&path}) [static]

从库的搜索路径列表中移除path。如果path是空的，或者不存在于列表，则列表不会改变。

当QCoreApplication被析构时，此列表会被还原。


\begin{seeAlso}
exec()，QTimer和QEventLoop::processEvents()。
\end{seeAlso}


void QCoreApplication::removeNativeEventFilter(QAbstractNativeEventFilter *filterObject)

从此实例中移除filterObject事件过滤器。如果这个事件过滤器没有被安装，则什么也不做。

当此实例被销毁时，所有的事件过滤器都会自动被移除。

任何时候——甚至正在事件过滤被激活时（通过nativeEventFilter()函数)——移除一个事件过滤器都是安全的。

此函数自Qt 5.0引入。



\begin{seeAlso}
installNativeEventFilter()。
\end{seeAlso}


void QCoreApplication::removePostedEvents(QObject *receiver, int eventType = 0) [static]

移除所指定的 eventType 类型且由postEvent()所添加的事件。

这些事件不会被派发，而是直接从队列中移除。您从来都不需要调用此方法。如果您确实调用了它，那么请注意杀掉事件可能会影响 receiver 的不变性(invariant)。

如果接收者为 \hl{nullptr}，那么所有对象将会移除 eventType 所指定的所有事件。如果 eventType 为0，那么receiver的所有事件将会被移除。自始自终，您都不应将 0 传递给 eventType 。


\begin{notice}
此函数是线程安全的。
\end{notice}

此函数自Qt 4.3引入。

bool QCoreApplication::removeTranslator(QTranslator *translationFile) [static]

从此应用程序使用的翻译文件列表中删除翻译文件 translationFile 。 （不会在文件系统中删除此翻译文件。）

该函数成功时返回 true ，失败时返回 false 。


\begin{seeAlso}
installTranslator()，translate()，与 QObject::tr()。
\end{seeAlso}

bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event) [static]

通过函数 notify() 将事件 event 直接发送至接收对象 receiver 。返回从事件处理对象得到的返回值。

事件 不会 在发送之后删除掉。通常的方法是在栈上创建事件，例如：

\begin{cppcode}
QMouseEvent event(QEvent::MouseButtonPress, pos, 0, 0, 0);
QApplication::sendEvent(mainWindow, &event);
\end{cppcode}



\begin{seeAlso}
postEvent() 与 notify()。
\end{seeAlso}

void QCoreApplication::sendPostedEvents(QObject *receiver = nullptr, int event\_type = 0) [static]

立刻分派所有先前通过 QCoreApplication::postEvent() 进入队列的事件。这些事件是针对接收对象的，且事件类型为 event\_type 。

该函数不会对来自窗口系统的事件进行分派，如有需求请参考 processEvents()。

如果接收对象指针为 nullptr ，event\_type 的所有事件将分派到所有对象。如果 event\_type 为 0 ，所有事件将发送到接收对象 receiver 。


\begin{notice}
该方法必须由其 QObject 参数 receiver 所在的线程调用。

\end{notice}


\begin{seeAlso}
flush() 与 postEvent()。
\end{seeAlso}

void QCoreApplication::setAttribute(Qt::ApplicationAttribute attribute, bool on = true) [static]

如果 on 为 true ，则设置属性 attribute；否则清除该属性。

\begin{notice}
在创建 QCoreApplication 实例之前，一些应用程序的属性必须要设置。 有关更多信息，请参考 Qt::ApplicationAttribute 文档。
\end{notice}

\begin{seeAlso}
testAttribute()。
\end{seeAlso}

void QCoreApplication::setEventDispatcher(QAbstractEventDispatcher *eventDispatcher) [static]

将主线程的事件分派器设置为 eventDispatcher 。只有在还没有安装事件分派器的情况下，也就是在实例化 QCoreApplication 之前，才可以进行设置。此方法获取对象的所有权。

\begin{seeAlso}
eventDispatcher()。
\end{seeAlso}

void QCoreApplication::setLibraryPaths(const QStringList \&paths) [static]

将加载库时要搜索的目录列表设置为 paths。现有的所有路径将被删除，路径列表将从参数 paths 中获取。

当实例 QCoreApplication 被析构时，库路径将设置为默认值。

\begin{seeAlso}
libraryPaths()、addLibraryPath()、removeLibraryPath() 与 QLibrary。
\end{seeAlso}

void QCoreApplication::setSetuidAllowed(bool allow) [static]

若 allow 为 true，允许程序在 UNIX 平台上运行 setuid 。

若 allow 为 false （默认值），且 Qt 检测到程序使用与实际用户id不同的有效用户id运行，那么在创建 QCoreApplication 实例时程序将中止。

Qt 受攻击面较大，因此它并不是一个恰当 setuid 程序解决方案。 不过，出于历史原因，可能某些程序仍需要这种方式运行。 当检测到此标志时，可防止 Qt 中止应用程序。须在创建 QCoreApplication 实例之前将其进行设置。



\begin{notice}
强烈建议不要打开此选项，它会带来安全风险。
\end{notice}

此函数自Qt 5.3引入。

\begin{seeAlso}
isSetuidAllowed()。
\end{seeAlso}

bool QCoreApplication::startingUp()

如果应用程序对象尚未创建，则返回 true ；否则返回 false 。



\begin{seeAlso}
closingDown()。
\end{seeAlso}

bool QCoreApplication::testAttribute(Qt::ApplicationAttribute attribute) [static]

如果设置了属性 attribute ，返回 true ；否则返回 false 。


\begin{seeAlso}
setAttribute()。
\end{seeAlso}

QString QCoreApplication::translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) [static]

搜索最近到首次安装的翻译文件，查询翻译文件中 sourceText 对应的翻译内容，返回其结果。

QObject::tr() 作用相同且使用更便捷。

context 通常为类名（如 "MyDialog"），sourceText 则是英文文本或简短的识别文本。

disambiguation 为一段识别字符串，用于同一上下文中不同角色使用相同的 sourceText 。它的默认值为 nullptr。

有关上下文、消除歧义和注释的更多信息，请参阅 QTranslator 和 QObject::tr() 文档。

n 与 \%n 一并使用以便支持复数形式。详见 QObject::tr() 。

如果没有任何翻译文件包含 context 中 sourceText 的翻译内容，该函数则返回 QString 包裹的 sourceText 。

此函数非虚函数。您可以子类化 QTranslator 来使用其他翻译技术。


\begin{notice}
此函数线程安全。
\end{notice}


\begin{seeAlso}
QObject::tr()，installTranslator()，removeTranslator()，与 translate()。
\end{seeAlso}

\splitLine

相关非成员函数

void qAddPostRoutine(QtCleanUpFunction ptr)

添加一个全局例程，它将在 QCoreApplication 析构函数中调用。这个函数通常用来作为在程序范围功能内，添加程序清除例程的函数。

清除例程的调用顺序与添加例程的顺序相反。

参数 \emph{ptr} 指定的函数应既没有参数，也没有返回值，例如：


\begin{cppcode}
static int *global_ptr = nullptr;

static void cleanup_ptr()
{
    delete [] global_ptr;
    global_ptr = nullptr;
}

void init_ptr()
{
    global_ptr = new int[100];      // allocate data
    qAddPostRoutine(cleanup_ptr);   // delete later
}
\end{cppcode}



\begin{notice}
对于应用程序或模块范围的清理，qAddPostRoutine() 通常不太合适。例如，若程序被分割成动态加载的模块，那么相关的模块可能在 QCoreApplication 的析构函数调用之前就卸载了。在这种情况下，如果仍想使用 qAddPostRoutine() ，可以使用 qRemovePostRoutine() 来防止 QCoreApplication 的析构函数调用一个例程。举个例子，在模块卸载前调用 qRemovePostRoutine() 。
\end{notice}

对于模块或库，使用引用计数初始化管理器，或者 Qt 对象树删除机制可能会更
好。下面是一个私有类使用对象树机制正确调用清除函数的一个例子：

\begin{cppcode}
class MyPrivateInitStuff : public QObject
{
public:
    static MyPrivateInitStuff *initStuff(QObject *parent)
    {
        if (!p)
            p = new MyPrivateInitStuff(parent);
        return p;
    }

    ~MyPrivateInitStuff()
    {
        // cleanup goes here
    }

private:
    MyPrivateInitStuff(QObject *parent)
        : QObject(parent)
    {
        // initialization goes here
    }

    MyPrivateInitStuff *p;
};
\end{cppcode}

通过选择正确的父对象，正常情况下可以在正确的时机清理模块的数据。

\begin{notice}
 函数自 Qt 5.10 已线程安全
\end{notice}

\begin{notice}
该函数线程安全
\end{notice}

\begin{seeAlso}
qRemovePostRoutine()。
\end{seeAlso}


void qRemovePostRoutine(QtCleanUpFunction ptr)

\begin{notice}
函数自 Qt 5.10 已线程安全
\end{notice}

 

\begin{notice}
该函数线程安全
\end{notice}


此函数自 Qt 5.3 引入。



\begin{seeAlso}
qAddPostRoutine()。
\end{seeAlso}

\splitLine

\section{宏文档}

Q\_COREAPP\_STARTUP\_FUNCTION(QtStartUpFunction ptr)

添加一个全局函数，它将在 QCoreApplication 的构造函数中调用。这个宏通常用于为程序范围内的功能初始化库，无需应用程序调用库进行初始化。

参数 \emph{ptr} 指定的函数应既没有参数，也没有返回值，例如：


\begin{cppcode}
// Called once QCoreApplication exists
static void preRoutineMyDebugTool()
{
    MyDebugTool* tool = new MyDebugTool(QCoreApplication::instance());
    QCoreApplication::instance()->installEventFilter(tool);
}

Q_COREAPP_STARTUP_FUNCTION(preRoutineMyDebugTool)
\end{cppcode}



 

如果删除了 QCoreApplication 并创建了另一个 QCoreApplication ，将再次调用启动函数。

 
\begin{notice}
此宏不适用于静态链接到应用程序中的库代码中使用，因为链接器可能会删除该函数，使其根本不会被调用。
\end{notice}


\begin{notice}
 此函数是可重入的。
\end{notice}


此函数自 Qt 5.1 引入。

\splitLine

Q\_DECLARE\_TR\_FUNCTIONS(context)

Q\_DECLARE\_TR\_FUNCTIONS() 宏使用以下签名声明并实现了两个转换函数 tr() 和 trUtf8()：

\begin{cppcode}
static inline QString tr(const char *sourceText,
                         const char *comment = nullptr);
static inline QString trUtf8(const char *sourceText,
                             const char *comment = nullptr);
\end{cppcode}

如果您想在不继承 QObject 的类使用 QObject::tr() 或者 QObject::Utf8() ，这个宏就非常适用。

\textbf{Q\_DECLARE\_TR\_FUNCTIONS()} 宏必须写在类的第一行（在第一个 public: 或
protected: 之前），例如：

\begin{cppcode}
class MyMfcView : public CView
{
    Q_DECLARE_TR_FUNCTIONS(MyMfcView)

public:
    MyMfcView();
    ...
};
\end{cppcode}

通常 \emph{context} 参数为类名，不过也可以是任何文本。

\begin{seeAlso}
	Q\_OBJECT，QObject::tr()，与 QObject::trUtf8()。
\end{seeAlso}
